package top.lixunda.ecommerce.server.good.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import top.lixunda.ecommerce.server.good.api.entity.db.GoodOrderDO;
import top.lixunda.ecommerce.server.good.api.entity.dto.AdminOrderDetailQueryDTO;
import top.lixunda.ecommerce.server.good.api.entity.dto.GoodOrderInsertDTO;
import top.lixunda.ecommerce.server.good.api.entity.dto.OrderDetailQueryDTO;
import top.lixunda.ecommerce.server.good.api.entity.dto.StoreOrderDetailQueryDTO;
import top.lixunda.ecommerce.server.good.api.entity.vo.OrderConvertVO;
import top.lixunda.ecommerce.server.good.api.entity.db.OrderDetailDO;
import top.lixunda.ecommerce.server.business.api.entity.dto.PageConvertDTO;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * VIEW 服务类
 * </p>
 *
 * @author Xumda
 * @since 2019-12-18
 */
public interface IOrderDetailService extends IService<OrderDetailDO> {

    /**
     * 根据订单id查看多个订单信息，但api可以查看本人的所有订单, 默认根据时间排序
     *
     * @param ids 订单id
     * @return 订单详细数据
     */
    List<OrderConvertVO> queryOrderDetailByIds(List<Integer> ids);

    /**
     * 分页条件查询
     *
     * @param pageDTO 分页数据和提哦啊见数据
     * @return 订单详细数据列表
     */
    IPage<OrderConvertVO> queryOrderDetailPageWrapper(
            PageConvertDTO<GoodOrderDO, OrderDetailDO, OrderDetailQueryDTO> pageDTO);

    /**
     * 店铺调用，根据订单id查看多个订单信息，但api可以查看本人的所有订单, 默认根据时间排序
     *
     * @param ids 订单id
     * @return 订单详细数据
     */
    List<OrderConvertVO> queryOrderDetailByIdsStore(List<Integer> ids);

    /**
     * 店铺调用，分页条件查询
     *
     * @param pageDTO 分页数据和提哦啊见数据
     * @return 订单详细数据列表
     */
    IPage<OrderConvertVO> queryOrderDetailPageWrapperStore(
            PageConvertDTO<GoodOrderDO, OrderDetailDO, StoreOrderDetailQueryDTO> pageDTO);

    /**
     * 管理员调用，根据订单id查看多个订单信息，但api可以查看本人的所有订单, 默认根据时间排序
     *
     * @param ids 订单id
     * @return 订单详细数据
     */
    List<OrderConvertVO> queryOrderDetailByIdsAdmin(List<Integer> ids);

    /**
     * 管理员调用，分页条件查询
     *
     * @param pageDTO 分页数据和提哦啊见数据
     * @return 订单详细数据列表
     */
    IPage<OrderConvertVO> queryOrderDetailPageWrapperAdmin(
            PageConvertDTO<GoodOrderDO, OrderDetailDO, AdminOrderDetailQueryDTO> pageDTO);

    /**
     * 用户调用，根据id删除订单
     *
     * @param ids 订单id列表
     * @return 是否删除成功
     */
    Boolean removeOrderByIds(List<Integer> ids);

    /**
     * 店家调用，根据id删除订单
     *
     * @param ids 订单id列表
     * @return 是否删除成功
     */
    Boolean removeOrderByIdsStore(List<Integer> ids);

    /**
     * 直接购买商品，生成订单
     *
     * @param goodOrderInsertDTO DTO
     * @return OrderConvertVO
     */
    OrderConvertVO insertGoodOrderDTO(
            GoodOrderInsertDTO goodOrderInsertDTO);

    /**
     * 根据id取消订单
     *
     * @param ids 取消订单的订单编号
     * @return 取消的订单数据
     */
    List<OrderConvertVO> cancelOrderByIds(List<Integer> ids);

    /**
     * 购买商品并前往支付
     *
     * @param returnUrl 支付返回地址
     * @param goodOrderInsertDTO DTO
     * @return String 页面html
     */
    String buyGoodToOrderPage(String returnUrl, GoodOrderInsertDTO goodOrderInsertDTO);

    /**
     * 对本地订单进行支付
     *
     * @param orderId 订单id
     * @param returnUrl 支付返回地址
     * @return 返回页面html
     */
    String toPayOrderPage(int orderId, String returnUrl);

    /**
     * 对本地订单进行支付
     *
     * @param returnUrl 支付返回地址
     * @param orderConvertVO 订单数据
     * @return 返回页面html
     */
    String toPayOrderPage(String returnUrl, OrderConvertVO orderConvertVO);

    /**
     * 订单支付回调
     *
     * @param map 数据
     * @param request HttpServletRequest
     * @return 错误信息
     */
    String payOrderNotifyCallback(Map<String, String> map, HttpServletRequest request);

    /**
     * 用户调用，申请退款，申请后由店家验证退款
     *
     * @param orderId 订单编号
     * @param message 申请理由
     * @return 是否申请成功
     */
    Boolean applyRefundByOrderId(Integer orderId, String message);

    /**
     * 用户调用，根据申请id取消退款申请
     *
     * @param id 退款申请id
     * @return 是否取消成功
     */
    Boolean applyRefundCancelById(Integer id);

    /**
     * 用户调用，根据订单id取消退款申请
     *
     * @param orderId 订单id
     * @return 是否取消成功
     */
    Boolean applyRefundCancelByOrderId(Integer orderId);

    /**
     * 商家调用，根据orderId对商品进行退款操作
     *
     * @param orderId OrderId
     * @return Boolean 是否成功
     */
    Boolean refundByOrderId(Integer orderId);

    /**
     * 用户调用，根据订单编号移除订单
     *
     * @param id 订单编号
     * @return 是否移除成功
     */
    Boolean removeOrderUserById(Integer id);

    /**
     * 店铺调用，根据订单编号移除订单
     *
     * @param id 订单编号
     * @return 是否移除成功
     */
    Boolean removeOrderStoreById(Integer id);
}
